package com.campus.food.service;

import com.campus.food.model.entity.Merchant;

import java.util.List;

/**
 * 商家服务接口
 * 
 * @author Claude3.7 Sonnet
 * @since 2025-05-29
 */
public interface MerchantService {
    
    /**
     * 商家入驻申请
     * @param merchant 商家信息
     * @return 申请成功的商家信息
     */
    Merchant applyMerchant(Merchant merchant);
    
    /**
     * 根据ID查询商家
     * @param id 商家ID
     * @return 商家信息
     */
    Merchant getMerchantById(Long id);
    
    /**
     * 根据用户ID查询商家
     * @param userId 用户ID
     * @return 商家信息
     */
    Merchant getMerchantByUserId(Long userId);
    
    /**
     * 更新商家信息
     * @param merchant 商家信息
     * @return 更新结果
     */
    boolean updateMerchant(Merchant merchant);
    
    /**
     * 更新商家审核状态
     * @param id 商家ID
     * @param status 审核状态（0-待审核，1-审核通过，2-审核拒绝）
     * @return 更新结果
     */
    boolean updateMerchantStatus(Long id, Integer status);
    
    /**
     * 更新商家营业状态
     * @param id 商家ID
     * @param businessStatus 营业状态（0-休息中，1-营业中）
     * @return 更新结果
     */
    boolean updateBusinessStatus(Long id, Integer businessStatus);
    
    /**
     * 分页查询商家列表
     * @param page 页码
     * @param size 每页大小
     * @param shopName 店铺名称（可选）
     * @param status 审核状态（可选）
     * @param businessStatus 营业状态（可选）
     * @return 商家列表
     */
    List<Merchant> getMerchantList(int page, int size, String shopName, Integer status, Integer businessStatus);
    
    /**
     * 查询商家总数
     * @param shopName 店铺名称（可选）
     * @param status 审核状态（可选）
     * @param businessStatus 营业状态（可选）
     * @return 商家总数
     */
    long getMerchantCount(String shopName, Integer status, Integer businessStatus);
    
    /**
     * 根据审核状态查询商家列表
     * @param status 审核状态
     * @return 商家列表
     */
    List<Merchant> getMerchantsByStatus(Integer status);
    
    /**
     * 根据营业状态查询商家列表
     * @param businessStatus 营业状态
     * @return 商家列表
     */
    List<Merchant> getMerchantsByBusinessStatus(Integer businessStatus);
    
    /**
     * 查询营业中的商家列表（用户端）
     * @param page 页码
     * @param size 每页大小
     * @param shopName 店铺名称（可选）
     * @param minRating 最小评分（可选）
     * @param maxRating 最大评分（可选）
     * @param minSales 最小销量（可选）
     * @param maxSales 最大销量（可选）
     * @param orderBy 排序方式（可选，支持：rating_desc, rating_asc, sales_desc, sales_asc）
     * @return 商家列表
     */
    List<Merchant> getOpenMerchants(int page, int size, String shopName, Double minRating, Double maxRating, 
                                   Integer minSales, Integer maxSales, String orderBy);
    
    /**
     * 查询营业中的商家总数（用户端）
     * @param shopName 店铺名称（可选）
     * @param minRating 最小评分（可选）
     * @param maxRating 最大评分（可选）
     * @param minSales 最小销量（可选）
     * @param maxSales 最大销量（可选）
     * @return 商家总数
     */
    long getOpenMerchantsCount(String shopName, Double minRating, Double maxRating, Integer minSales, Integer maxSales);
    
    /**
     * 更新商家评分
     * @param id 商家ID
     * @param rating 评分
     * @return 更新结果
     */
    boolean updateRating(Long id, Double rating);
    
    /**
     * 更新商家月销量
     * @param id 商家ID
     * @param monthlySales 月销量
     * @return 更新结果
     */
    boolean updateMonthlySales(Long id, Integer monthlySales);
    
    /**
     * 检查用户是否已有商家信息
     * @param userId 用户ID
     * @return 是否存在
     */
    boolean existsByUserId(Long userId);
    
    /**
     * 删除商家
     * @param id 商家ID
     * @return 删除结果
     */
    boolean deleteMerchant(Long id);
    
    /**
     * 商家审核（管理员操作）
     * @param id 商家ID
     * @param status 审核状态
     * @param reason 审核意见（拒绝时必填）
     * @return 审核结果
     */
    boolean auditMerchant(Long id, Integer status, String reason);
    
    /**
     * 获取商家统计数据
     * @param id 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计数据
     */
    Object getStatistics(Long id, String startTime, String endTime);
    
    /**
     * 获取商家订单趋势数据
     * @param id 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param timeUnit 时间单位（day, week, month）
     * @return 趋势数据列表
     */
    List<Object> getOrderTrend(Long id, String startTime, String endTime, String timeUnit);
    
    /**
     * 获取商家菜品销售占比数据
     * @param id 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 数量限制
     * @return 销售占比数据列表
     */
    List<Object> getFoodSalesProportion(Long id, String startTime, String endTime, Integer limit);
    
    /**
     * 获取商家订单状态分布数据
     * @param id 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 状态分布数据
     */
    Object getOrderStatusDistribution(Long id, String startTime, String endTime);
    
    /**
     * 获取商家客户统计数据
     * @param id 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 客户统计数据列表
     */
    List<Object> getCustomerStatistics(Long id, String startTime, String endTime);
    
    /**
     * 获取商家热销商品排行
     * @param id 商家ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 数量限制
     * @return 热销商品列表
     */
    List<Object> getHotFoods(Long id, String startTime, String endTime, Integer limit);
} 